package gestorvideoclub;

import gestorvideoclub.enumeraciones.TipoProductoEnum;
import gestorvideoclub.jdbc.PeliculaJDBC;
import gestorvideoclub.jdbc.TarifaJDBC;
import gestorvideoclub.jdbc.VideojuegoJDBC;
import gestorvideoclub.util.UtilFecha;
import gestorvideoclub.util.introduceDatos;
import java.util.*;
import java.util.ArrayList;
import javax.management.timer.Timer;


public class Tarifa {
    private int id;
    private String nombreTarifa;
    private TipoProductoEnum tipoProducto;
    private double precio;
    private Date fechaInicio;
    private Date fechaFin;

    public Tarifa(){}

    public Tarifa(String nombreTarifa, TipoProductoEnum tipoProducto, double precio, Date fechaInicio, Date fechaFin){
        this.nombreTarifa = nombreTarifa;
        this.tipoProducto = tipoProducto;
        this.precio = precio;
        this.fechaInicio = fechaInicio;
        this.fechaFin = fechaFin;
    }

    public Tarifa(int cod, String nombreTarifa, TipoProductoEnum tipoProducto, double precio, Date fechaInicio, Date fechaFin){
        this.id = cod;
        this.nombreTarifa = nombreTarifa;
        this.tipoProducto = tipoProducto;
        this.precio = precio;
        this.fechaInicio = fechaInicio;
        this.fechaFin = fechaFin;
    }    
    
    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public String getNombreTarifa() {
        return nombreTarifa;
    }

    public void setNombreTarifa(String nombreTarifa) {
        this.nombreTarifa = nombreTarifa;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public double getPrecio() {
        return precio;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }

    public TipoProductoEnum getTipoProducto() {
        return tipoProducto;
    }

    public void setTipoProducto(TipoProductoEnum tipoProducto) {
        this.tipoProducto = tipoProducto;
    }

    @Override
    public boolean equals(Object o) {
        boolean dev = false;
        if (o instanceof Tarifa) {
            Tarifa aux = (Tarifa) o;
            if (this.getNombreTarifa().equalsIgnoreCase(aux.getNombreTarifa())) {
                dev = true;
            } else {
                dev = false;
            }
        }
        return dev;
    }    
    
    @Override
    public String toString(){
        return "\n\nNombre: "+this.nombreTarifa+"\nTipo De Producto: "+this.tipoProducto+"\nPrecio: "+this.precio+"\nFecha Inicio: "+this.fechaInicio+"\nFecha Fin: "+this.fechaFin;
    }
   
    public Tarifa recogeDatos(){
        int dias;
        String titulo, titProd;
        TipoProductoEnum tipo = null;
        Tarifa t = new Tarifa();
        float precio;
        long fechaIni, fechaFin;
        System.out.println("ALTA TARIFA");
        System.out.println("Introduce Titulo: ");
        titulo = introduceDatos.introduceString();
        tipo= recogeTipoProductoTarifa();
        System.out.println("Introduce Precio Tarifa: ");
        precio = introduceDatos.introduceFloat();
        fechaIni =  System.currentTimeMillis();//guardamos fecha actual como fecha de inicio
        System.out.println("Cuanto tiempo vas a tener la Tarifa activa(dias): ");
        dias = introduceDatos.introduceEntero();
        Date fechaInicio = new Date(fechaIni);
        Date fechaFinal = new Date(fechaInicio.getTime() + dias * Timer.ONE_DAY);
        System.out.println(fechaInicio);
        System.out.println(fechaFinal);
        String fechaSQL = UtilFecha.fechaMySQL(fechaFinal);
        String fechaSQL2 = UtilFecha.fechaMySQL(fechaInicio);
        System.out.println(fechaSQL);
        System.out.println(fechaSQL2);
        return new Tarifa(titulo,tipo,precio,fechaInicio, fechaFinal);        
    }
    
    public void recorreLista(List l) {
        int cont = 1;
        if(l.isEmpty())
            System.out.println("Lista de Tarifas vacia");
        else
        {
            for (Object p : l) {
                Tarifa aux = (Tarifa) p;
                System.out.print("\n---TARIFA NUMERO " + cont + "---");
                System.out.println(aux);
                cont++;
            }
        }
    }
    
    public void altaTarifa() {
        Tarifa t = recogeDatos();
        TarifaJDBC.insertaTarifa(t);
    }    
    
    /*
     * metodo que nos devuelve el tipo de producto elegido.
     */
    public TipoProductoEnum recogeTipoProductoTarifa(){
        TipoProductoEnum tipo=null;
        int eligeTipoProducto;
        boolean salir=false;
        do {
            System.out.println("Elige tipo de Producto para la tarifa");
            System.out.println("1.- DVD");
            System.out.println("2.- BLUE-RAY");
            System.out.println("3.- VIDEOJUEGO");
            eligeTipoProducto = introduceDatos.introduceEntero();
            switch (eligeTipoProducto) {
                case 1:
                    tipo = TipoProductoEnum.DVD;
                    salir = true;
                    break;
                case 2:
                    tipo = TipoProductoEnum.BlueRay;
                    salir = true;
                    break;
                case 3:
                    tipo = TipoProductoEnum.Videojuego;
                    salir = true;
                    break;
            }
        } while (!salir);
        return tipo;        
    }  
    
    public void listadoTarifas(){
        List<Tarifa> lista= TarifaJDBC.consultaTarifas();
        recorreLista(lista);
    }
    
    public void modificacionTarifa(){
        TipoProductoEnum tipo = null;
        int numero,codigo;
        Tarifa t=new Tarifa();
        Date fechaInicio=new Date();
        Date fechaFinal=new Date();
        String recoge;
        boolean salir= false, listo=false, dev=true, dev2=true;
        System.out.println("Introduzca Codidgo de Tarifa: ");
        codigo = introduceDatos.introduceEntero2();
        try{
            t = TarifaJDBC.consultaTarifaPorId(codigo);
            System.out.println(t.toString());//muestra la pelicula
        }catch(Exception e){
            System.out.println("No Existe Tarifa");
            salir = true;
        } if(!salir) 
        {
            t.toString();
            System.out.println("---MODIFICACION TARIFA---");
            do {
                do {
                    System.out.println("Introduce dato que quieres modificar: ");
                    System.out.println("1.- Titulo");
                    System.out.println("2.- TipoProducto");
                    System.out.println("3.- Precio");
                    System.out.println("4.- Fecha de Inicio");
                    System.out.println("5.- Fecha de Fin");
                    System.out.println("6.- SALIR");
                    numero = introduceDatos.introduceEntero2();
                } while (numero > 6 || numero < 1);
                switch (numero) {
                    case 1:
                        System.out.println("Introduce Nuevo Titulo: ");
                        t.setNombreTarifa(introduceDatos.introduceString2());
                        break;
                    case 2: tipo= recogeTipoProductoTarifa();
                            t.setTipoProducto(tipo);
                            break;
                    case 3: System.out.println("Introduce Nueva Precio: ");
                            t.setPrecio(introduceDatos.introduceEntero2());
                            break;
                    case 4: do{
                                System.out.println("FECHA INICIO");
                                fechaInicio = recogeFecha();
                                int cuxa2 = t.getFechaFin().compareTo(fechaInicio);
                                if(cuxa2<=0)
                                {
                                    dev=false;
                                    System.out.println("Error, Fecha Inicio>Fecha Fin. Por favor introduza Fecha Inicial\n");
                                }
                                else
                                    dev=true;
                            }while(!dev);
                             t.setFechaInicio(fechaInicio);
                            break;
                    case 5:
                            do{
                                System.out.println("FECHA FIN");
                                fechaFinal = recogeFecha();
                                int cuxa = fechaFinal.compareTo(t.getFechaInicio());
                                if(cuxa<=0)
                                {
                                    dev2=false;
                                    System.out.println("Error, Fecha Fin<Fecha Inicio. Por favor introduza Fecha Final\n");
                                }
                                else
                                    dev2=true;
                            }while(!dev2);
                            t.setFechaFin(fechaFinal);
                            break;
                }
                System.out.println("Desear seguir modificando alguna propiedad mas(s/n): ");
                recoge = introduceDatos.introduceString2();
                do {
                    if (recoge.compareToIgnoreCase("s") == 0 || recoge.compareToIgnoreCase("n") == 0) {
                        listo = true;
                    } else {
                        System.out.println("Introduzca s/n por favor: ");
                        recoge = introduceDatos.introduceString2();
                    }
                } while (!listo);
            } while (recoge.compareToIgnoreCase("s") == 0);
            TarifaJDBC.sobreescribeTarifa(t);
        }
    }
    /*
     * metodo que recoge fecha por teclado y la devuelve
     *
     */
    public Date recogeFecha(){
        boolean salir= false;
        String recoge,muestra;
        Date fecha = new Date();
        do{
            System.out.println("Introduce dia(1-31):");
            int dia = introduceDatos.introduceEntero();
            System.out.println("Introduce Mes(1-12):");
            int mes = introduceDatos.introduceEntero() - 1;//enero empieza en 0
            System.out.println("Introduce año:");
            int anno = introduceDatos.introduceEntero();
            GregorianCalendar gc = new GregorianCalendar();
            gc.set(anno, mes, dia);
            fecha = gc.getTime();
            muestra = UtilFecha.fechaMostrar(fecha);
            System.out.println("FECHA INTRODUCIDA: "+muestra);
            System.out.println("Fecha Correcta(s/n): ");
            recoge = introduceDatos.introduceString2();
            do{
             if (recoge.compareToIgnoreCase("s") == 0 || recoge.compareToIgnoreCase("n") == 0) {
                        salir = true;
                    } else {
                        System.out.println("Introduzca s/n por favor: ");
                        recoge = introduceDatos.introduceString2();
                    }
            }while (!salir);
        } while (recoge.compareToIgnoreCase("n") == 0);
    return fecha;
    }
    
    /*
     * metodo para dar de baja una tarifa
     */
    public void bajaTarifa(){
        int codigo;
        boolean salir=false;
        Tarifa t = new Tarifa();
        System.out.println("Introduzca Codidgo de Tarifa: ");
        codigo = introduceDatos.introduceEntero2();
        try{
            t = TarifaJDBC.consultaTarifaPorId(codigo);
            TarifaJDBC.bajaTarifa(t);
        }catch(Exception e){
            System.out.println(e.getMessage());
            salir = true;
        }
        if(!salir) 
        {
             System.out.println("--LISTADO DE PRODUCTOS--");
            //actualizamos tarifas de productos que tengan la tarifa que se da de baja
            if(t.getTipoProducto().toString().equals("DVD")|| t.getTipoProducto().toString().equals("BlueRay"))
            {
                List<Pelicula> lista = PeliculaJDBC.consultaPeliculas();
                Pelicula.recorreLista(lista);
            }
            else
            {
                List<Videojuego> lista = VideojuegoJDBC.consultaVideojuegos();
                Videojuego.recorreLista(lista);
            }
        }
    
    }
}
    
